{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "HW2: Logistic回归&SVM\n",
    "1、 任务描述\n",
    "请在Pima Indians Diabetes Data Set（皮马印第安人糖尿病数据集）进行分类器练习。\n",
    "需要提交代码文件，并给出必要的结果解释。\n",
    "1) 训练数据和测试分割（ 随机选择 20% 的数据作为测试集 ）；（ 10分）\n",
    "2) 适当的特征工程 （及数据探索） ;（10分）\n",
    "3) LogisticLogisticLogisticLogisticLogisticLogisticLogisticLogistic回归，并选择最佳的 正则函数（ L1/L2L1/L2L1/L2L1/L2L1/L2）及 正则参数； （30分）\n",
    "4) 线性 SVMSVMSVM，并选择最佳正则参数，比较与 ，并选择最佳正则参数比较与 ，并选择最佳正则参数比较与 LogisticLogisticLogisticLogisticLogisticLogisticLogisticLogistic回归的性能，简单说明原因。 回归的性能，简单说明原因。 回归的性能，简单说明原因。 回归的性能，简单说明原因。 回归的性能，简单说明原因。 回归的性能，简单说明原因。 （20 分）\n",
    "5) RBFRBFRBF核的 SVMSVMSVM，并选择最佳的 超参数（ 正则参数 、RBFRBFRBF核函数宽度） ；（ 30分）\n",
    "2、 数据说明：\n",
    "原始数据集地址：https://archive.ics.uci.edu/ml/datasets/Pima+Indians+Diabetes\n",
    "数据集只有一个文件（diabetes.csv）：Pima Indians Diabetes Dataset包括根据医疗记录的比马印第安人5年内糖尿病的发病情况，这是一个两类分类问题。每个类的样本数目数量不均等。一共有 768 个样本，每个样本有8个输入变量和1个输出变量。缺失值通常用零值编码。\n",
    "1) 字段说明\n",
    "Pregnancies： 怀孕次数\n",
    "Glucose： 口服葡萄糖耐受试验中，2小时的血浆葡萄糖浓度。\n",
    "BloodPressure： 舒张压（mm Hg）\n",
    "SkinThickness： 三头肌皮肤褶层厚度（mm）\n",
    "Insulin：2小时血清胰岛素含量（μU/ ml）\n",
    "BMI： 体重指数（体重，kg /（身高，m）^ 2）\n",
    "2) DiabetesPedigreeFunction： 糖尿病家族史\n",
    "3) Age： 年龄（岁）\n",
    "Outcome： 输出变了/类别标签（0 或 1，出现糖尿病为1, 否则为 0）"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "1 导入相应的包"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "UsageError: unrecognized arguments: #图形出现在Notebook里而不是新窗口\n"
     ]
    }
   ],
   "source": [
    "# 导入必要的模块\n",
    "import pandas as pd \n",
    "import numpy as np\n",
    "# 载入库包\n",
    "from sklearn.linear_model import LogisticRegression  #逻辑回归\n",
    "from sklearn.model_selection import GridSearchCV  #网格搜索\n",
    "'''\n",
    "GridSearchCV(网格搜索)，它存在的意义就是自动调参，只要把参数输进去，就能给出最优化的结果和参数。\n",
    "但是这个方法适合于小数据集，一旦数据的量级上去了，很难得出结果。这个时候就是需要动脑筋了。\n",
    "数据量比较大的时候可以使用一个快速调优的方法——坐标下降。它其实是一种贪心算法：拿当前对模型影响最大的参数调优，直到最优化；\n",
    "再拿下一个影响最大的参数调优，如此下去，直到所有的参数调整完毕。\n",
    "这个方法的缺点就是可能会调到局部最优而不是全局最优，但是省时间省力，巨大的优势面前，还是试一试吧，后续可以再拿bagging再优化。\n",
    "'''\n",
    "from sklearn.metrics import classification_report #分类预估评价函数\n",
    "'''\n",
    "classification_report用来分析不同类别的准确率，召回率，F1值等，从而便于按照类别查看准确率、召回率。\n",
    "'''\n",
    "\n",
    "#竞赛的评价指标为logloss\n",
    "from sklearn.metrics import log_loss  \n",
    "from sklearn import metrics #模型评估\n",
    "'''\n",
    "metrics模块实现了一些函数，用来评估预测误差。\n",
    "1. sklearn.metrics.roc_curve(true_y. pred_proba_score, pos_labal)\n",
    "计算roc曲线，roc曲线有三个属性：fpr, tpr,和阈值，因此该函数返回这三个变量\n",
    "2. sklearn.metrics.auc(x, y, reorder=False):\n",
    "计算AUC值，其中x,y分别为数组形式，根据(xi, yi)在坐标上的点，生成的曲线，然后计算AUC值\n",
    "3. sklearn.metrics.roc_auc_score(true_y, pred_proba_y)\n",
    "直接根据真实值（必须是二值）、预测值（可以是0/1, 也可以是proba值）计算出auc值，中间过程的roc计算省略\n",
    "'''\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns # sns是seaborn 的简写\n",
    "%matplotlib inline #图形出现在Notebook里而不是新窗口"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "2.读入数据\n",
    "\n",
    "数据预处理对训练数据和测试数据需进行同样处理，因此将二者一起读入"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Pregnancies</th>\n",
       "      <th>Glucose</th>\n",
       "      <th>BloodPressure</th>\n",
       "      <th>SkinThickness</th>\n",
       "      <th>Insulin</th>\n",
       "      <th>BMI</th>\n",
       "      <th>DiabetesPedigreeFunction</th>\n",
       "      <th>Age</th>\n",
       "      <th>Outcome</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>6</td>\n",
       "      <td>148</td>\n",
       "      <td>72</td>\n",
       "      <td>35</td>\n",
       "      <td>0</td>\n",
       "      <td>33.6</td>\n",
       "      <td>0.627</td>\n",
       "      <td>50</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>85</td>\n",
       "      <td>66</td>\n",
       "      <td>29</td>\n",
       "      <td>0</td>\n",
       "      <td>26.6</td>\n",
       "      <td>0.351</td>\n",
       "      <td>31</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>8</td>\n",
       "      <td>183</td>\n",
       "      <td>64</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>23.3</td>\n",
       "      <td>0.672</td>\n",
       "      <td>32</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>89</td>\n",
       "      <td>66</td>\n",
       "      <td>23</td>\n",
       "      <td>94</td>\n",
       "      <td>28.1</td>\n",
       "      <td>0.167</td>\n",
       "      <td>21</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "      <td>137</td>\n",
       "      <td>40</td>\n",
       "      <td>35</td>\n",
       "      <td>168</td>\n",
       "      <td>43.1</td>\n",
       "      <td>2.288</td>\n",
       "      <td>33</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Pregnancies  Glucose  BloodPressure  SkinThickness  Insulin   BMI  \\\n",
       "0            6      148             72             35        0  33.6   \n",
       "1            1       85             66             29        0  26.6   \n",
       "2            8      183             64              0        0  23.3   \n",
       "3            1       89             66             23       94  28.1   \n",
       "4            0      137             40             35      168  43.1   \n",
       "\n",
       "   DiabetesPedigreeFunction  Age  Outcome  \n",
       "0                     0.627   50        1  \n",
       "1                     0.351   31        0  \n",
       "2                     0.672   32        1  \n",
       "3                     0.167   21        0  \n",
       "4                     2.288   33        1  "
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 读入数据\n",
    "dpath = 'D:/jupyter/'\n",
    "train = pd.read_csv(dpath + \"diabetes.csv\")\n",
    "train.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "3.数据探索"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 768 entries, 0 to 767\n",
      "Data columns (total 9 columns):\n",
      "Pregnancies                 768 non-null int64\n",
      "Glucose                     768 non-null int64\n",
      "BloodPressure               768 non-null int64\n",
      "SkinThickness               768 non-null int64\n",
      "Insulin                     768 non-null int64\n",
      "BMI                         768 non-null float64\n",
      "DiabetesPedigreeFunction    768 non-null float64\n",
      "Age                         768 non-null int64\n",
      "Outcome                     768 non-null int64\n",
      "dtypes: float64(2), int64(7)\n",
      "memory usage: 54.1 KB\n"
     ]
    }
   ],
   "source": [
    "train.info() #查看数据详细情况"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "通过 info 方法可以看到样本数为768个，8个特征值，一个类别判断目标值。 数据中 BMI 和 DiabetesPedigreeFunction 为浮点数，其余数据都为整数。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Pregnancies</th>\n",
       "      <th>Glucose</th>\n",
       "      <th>BloodPressure</th>\n",
       "      <th>SkinThickness</th>\n",
       "      <th>Insulin</th>\n",
       "      <th>BMI</th>\n",
       "      <th>DiabetesPedigreeFunction</th>\n",
       "      <th>Age</th>\n",
       "      <th>Outcome</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>3.845052</td>\n",
       "      <td>120.894531</td>\n",
       "      <td>69.105469</td>\n",
       "      <td>20.536458</td>\n",
       "      <td>79.799479</td>\n",
       "      <td>31.992578</td>\n",
       "      <td>0.471876</td>\n",
       "      <td>33.240885</td>\n",
       "      <td>0.348958</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>3.369578</td>\n",
       "      <td>31.972618</td>\n",
       "      <td>19.355807</td>\n",
       "      <td>15.952218</td>\n",
       "      <td>115.244002</td>\n",
       "      <td>7.884160</td>\n",
       "      <td>0.331329</td>\n",
       "      <td>11.760232</td>\n",
       "      <td>0.476951</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.078000</td>\n",
       "      <td>21.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>99.000000</td>\n",
       "      <td>62.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>27.300000</td>\n",
       "      <td>0.243750</td>\n",
       "      <td>24.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>3.000000</td>\n",
       "      <td>117.000000</td>\n",
       "      <td>72.000000</td>\n",
       "      <td>23.000000</td>\n",
       "      <td>30.500000</td>\n",
       "      <td>32.000000</td>\n",
       "      <td>0.372500</td>\n",
       "      <td>29.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>6.000000</td>\n",
       "      <td>140.250000</td>\n",
       "      <td>80.000000</td>\n",
       "      <td>32.000000</td>\n",
       "      <td>127.250000</td>\n",
       "      <td>36.600000</td>\n",
       "      <td>0.626250</td>\n",
       "      <td>41.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>17.000000</td>\n",
       "      <td>199.000000</td>\n",
       "      <td>122.000000</td>\n",
       "      <td>99.000000</td>\n",
       "      <td>846.000000</td>\n",
       "      <td>67.100000</td>\n",
       "      <td>2.420000</td>\n",
       "      <td>81.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       Pregnancies     Glucose  BloodPressure  SkinThickness     Insulin  \\\n",
       "count   768.000000  768.000000     768.000000     768.000000  768.000000   \n",
       "mean      3.845052  120.894531      69.105469      20.536458   79.799479   \n",
       "std       3.369578   31.972618      19.355807      15.952218  115.244002   \n",
       "min       0.000000    0.000000       0.000000       0.000000    0.000000   \n",
       "25%       1.000000   99.000000      62.000000       0.000000    0.000000   \n",
       "50%       3.000000  117.000000      72.000000      23.000000   30.500000   \n",
       "75%       6.000000  140.250000      80.000000      32.000000  127.250000   \n",
       "max      17.000000  199.000000     122.000000      99.000000  846.000000   \n",
       "\n",
       "              BMI  DiabetesPedigreeFunction         Age     Outcome  \n",
       "count  768.000000                768.000000  768.000000  768.000000  \n",
       "mean    31.992578                  0.471876   33.240885    0.348958  \n",
       "std      7.884160                  0.331329   11.760232    0.476951  \n",
       "min      0.000000                  0.078000   21.000000    0.000000  \n",
       "25%     27.300000                  0.243750   24.000000    0.000000  \n",
       "50%     32.000000                  0.372500   29.000000    0.000000  \n",
       "75%     36.600000                  0.626250   41.000000    1.000000  \n",
       "max     67.100000                  2.420000   81.000000    1.000000  "
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#用常用统计量观察特征情况\n",
    "train.describe()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Insulin ,SkinThickness方差较大，波动较大。这可能与缺失值填补0有关系。之后会处理"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "4. 特征工程\n",
    "4.1 观察样本"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Target 分布，看看各类样本分布是否均衡\n",
    "sns.set()\n",
    "'''\n",
    "Seaborn直接提供了多种对matplotlib绘制的图形的美化功能，可以直接使用。\n",
    "只需要在绘制图形之前调用Seaborn的set()函数就可以直接使用其设定好的默认主题进行美化\n",
    "'''\n",
    "sns.countplot(train.Outcome); #sns.countplot能显示该列数据值的统计分布\n",
    "plt.xlabel('Outcome');\n",
    "plt.ylabel('Number of occurrences');"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "由图可以看出，输出的样本不均衡，不是糖药病的人比是糖药病的人多200多个"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "4.2.缺失值处理\n",
    "\n",
    "由于本作业把缺失值都编码为0，但是经过观察发现 Insulin,Glucose,BloodPressure,SkinThickness,BMI 这几个值编码为0显然是不正确的，正常人都会有这几个指标。 Pregnancies 未怀孕次数，无法辨别是0值是不是缺失值，不进行处理。 我们按是糖药病的人和不是糖药病的人进行分类。按照两个类别分别计算以上几个指标的平均值。然后对这些特征值的缺失值按照平均值进行填补。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\Anaconda3\\lib\\site-packages\\pandas\\core\\frame.py:3137: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame.\n",
      "Try using .loc[row_indexer,col_indexer] = value instead\n",
      "\n",
      "See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n",
      "  self[k1] = value[k2]\n",
      "D:\\Anaconda3\\lib\\site-packages\\ipykernel_launcher.py:32: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame.\n",
      "Try using .loc[row_indexer,col_indexer] = value instead\n",
      "\n",
      "See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n",
      "D:\\Anaconda3\\lib\\site-packages\\ipykernel_launcher.py:35: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame.\n",
      "Try using .loc[row_indexer,col_indexer] = value instead\n",
      "\n",
      "See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "Pregnancies                 0\n",
       "Glucose                     0\n",
       "BloodPressure               0\n",
       "SkinThickness               0\n",
       "Insulin                     0\n",
       "BMI                         0\n",
       "DiabetesPedigreeFunction    0\n",
       "Age                         0\n",
       "Outcome                     0\n",
       "dtype: int64"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 需要进行对0异常值做处理的特征\n",
    "zeroFields = ['Insulin',  'Glucose', 'BloodPressure', 'SkinThickness','BMI']\n",
    "trainFillOne = train[train[\"Outcome\"] == 1]\n",
    "trainFillZero = train[train[\"Outcome\"] == 0]\n",
    "\n",
    "# 建立是不是糖药病的人的两个字典存储平均值\n",
    "zeroDic = {}\n",
    "oneDic = {}\n",
    "for index in zeroFields:\n",
    "     zeroDic[index]=trainFillZero[index].sum()/len(trainFillZero.loc[trainFillZero[index] >0]); #loc——通过行标签索引行数据 \n",
    "     oneDic[index]=trainFillOne[index].sum()/len(trainFillOne.loc[trainFillOne[index] >0]);\n",
    "'''\n",
    "loc——通过行标签索引行数据 \n",
    "iloc——通过行号索引行数据 \n",
    "ix——通过行标签或者行号索引行数据（基于loc和iloc 的混合） \n",
    "同理，索引列数据也是如此\n",
    "https://blog.csdn.net/hecongqing/article/details/61927615\n",
    "'''\n",
    "# 对0值的缺失值进行转换为NA\n",
    "trainFillOne[zeroFields] =trainFillOne[zeroFields].where(trainFillOne[zeroFields]>0)    \n",
    "trainFillZero[zeroFields] = trainFillZero[zeroFields].where(trainFillZero[zeroFields] >0)\n",
    "'''\n",
    "where（）的用法:\n",
    "返回索引\n",
    "where()函数对于不同的输入，返回的值是不同的。\n",
    "1当数组是一维数组时，返回的值是一维的索引，所以只有一组索引数组\n",
    "2当数组是二维数组时，满足条件的数组值返回的是值的位置索引，因此会有两组索引数组来表示值的位置\n",
    "'''\n",
    "\n",
    "\n",
    "for key,val in zeroDic.items():  #,items()方法把字典转换成列表，即#进行填补用于返回字典的(key，value)元组对的列表\n",
    "    trainFillZero[key]=trainFillZero[key].fillna(val)\n",
    "\n",
    "for key,val in oneDic.items():\n",
    "    trainFillOne[key]=trainFillOne[key].fillna(val)    \n",
    "'''\n",
    "df.fillna(0) #用0填充缺失值 \n",
    "df.fillna('missing') 用字符串代替缺失值\n",
    "df.fillna(method='pad')#用前一个数据代替NaN\n",
    "df.fillna(method='bfill',limit=1)#用后一个数据替代NaN,限制每列只能替代一个NaN\n",
    "df.fillna(df.mean()['one':'two'])#用平均数代替,选择one，two两列进行缺失值处理\n",
    "'''\n",
    "\n",
    "# 填不完后，把两个dataFrame进行结合，并打乱顺序\n",
    "'''\n",
    "df.sample(frac=1)\n",
    "这样对可以对df进行打乱。其中参数frac是要返回的比例，比如df中有10行数据，我只想返回其中的30%,那么frac=0.3。\n",
    "\n",
    "pandas判断缺失值一般采用 isnull()，然而生成的却是所有数据的true／false矩阵\n",
    "IsNull(字段，默认值)是用于判断当为NULL的时候，即什么都没人输入的情况下，用什么默认值来代替；\n",
    "isnull(a.qtp,0)的意思是如果a.qtp为NULL时，则默认为0，否则取a.qtp的实际值；\n",
    "Sum(字段或表达式)，这个就很清楚了，就是求合计值。\n",
    "'''\n",
    "trainFilled = trainFillZero.append(trainFillOne)\n",
    "trainFilled = trainFilled.sample(frac = 1)\n",
    "trainFilled.isnull().sum()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "4.3数据探索"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Pregnancies</th>\n",
       "      <th>Glucose</th>\n",
       "      <th>BloodPressure</th>\n",
       "      <th>SkinThickness</th>\n",
       "      <th>Insulin</th>\n",
       "      <th>BMI</th>\n",
       "      <th>DiabetesPedigreeFunction</th>\n",
       "      <th>Age</th>\n",
       "      <th>Outcome</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.00000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>3.845052</td>\n",
       "      <td>121.697358</td>\n",
       "      <td>72.428141</td>\n",
       "      <td>29.247042</td>\n",
       "      <td>157.003527</td>\n",
       "      <td>32.44642</td>\n",
       "      <td>0.471876</td>\n",
       "      <td>33.240885</td>\n",
       "      <td>0.348958</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>3.369578</td>\n",
       "      <td>30.462008</td>\n",
       "      <td>12.106044</td>\n",
       "      <td>8.923908</td>\n",
       "      <td>88.860914</td>\n",
       "      <td>6.87897</td>\n",
       "      <td>0.331329</td>\n",
       "      <td>11.760232</td>\n",
       "      <td>0.476951</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>44.000000</td>\n",
       "      <td>24.000000</td>\n",
       "      <td>7.000000</td>\n",
       "      <td>14.000000</td>\n",
       "      <td>18.20000</td>\n",
       "      <td>0.078000</td>\n",
       "      <td>21.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>99.750000</td>\n",
       "      <td>64.000000</td>\n",
       "      <td>25.000000</td>\n",
       "      <td>121.500000</td>\n",
       "      <td>27.50000</td>\n",
       "      <td>0.243750</td>\n",
       "      <td>24.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>3.000000</td>\n",
       "      <td>117.000000</td>\n",
       "      <td>72.000000</td>\n",
       "      <td>28.000000</td>\n",
       "      <td>130.287879</td>\n",
       "      <td>32.05000</td>\n",
       "      <td>0.372500</td>\n",
       "      <td>29.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>6.000000</td>\n",
       "      <td>141.000000</td>\n",
       "      <td>80.000000</td>\n",
       "      <td>33.000000</td>\n",
       "      <td>206.846154</td>\n",
       "      <td>36.60000</td>\n",
       "      <td>0.626250</td>\n",
       "      <td>41.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>17.000000</td>\n",
       "      <td>199.000000</td>\n",
       "      <td>122.000000</td>\n",
       "      <td>99.000000</td>\n",
       "      <td>846.000000</td>\n",
       "      <td>67.10000</td>\n",
       "      <td>2.420000</td>\n",
       "      <td>81.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       Pregnancies     Glucose  BloodPressure  SkinThickness     Insulin  \\\n",
       "count   768.000000  768.000000     768.000000     768.000000  768.000000   \n",
       "mean      3.845052  121.697358      72.428141      29.247042  157.003527   \n",
       "std       3.369578   30.462008      12.106044       8.923908   88.860914   \n",
       "min       0.000000   44.000000      24.000000       7.000000   14.000000   \n",
       "25%       1.000000   99.750000      64.000000      25.000000  121.500000   \n",
       "50%       3.000000  117.000000      72.000000      28.000000  130.287879   \n",
       "75%       6.000000  141.000000      80.000000      33.000000  206.846154   \n",
       "max      17.000000  199.000000     122.000000      99.000000  846.000000   \n",
       "\n",
       "             BMI  DiabetesPedigreeFunction         Age     Outcome  \n",
       "count  768.00000                768.000000  768.000000  768.000000  \n",
       "mean    32.44642                  0.471876   33.240885    0.348958  \n",
       "std      6.87897                  0.331329   11.760232    0.476951  \n",
       "min     18.20000                  0.078000   21.000000    0.000000  \n",
       "25%     27.50000                  0.243750   24.000000    0.000000  \n",
       "50%     32.05000                  0.372500   29.000000    0.000000  \n",
       "75%     36.60000                  0.626250   41.000000    1.000000  \n",
       "max     67.10000                  2.420000   81.000000    1.000000  "
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "trainFilled.describe()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "通过填补缺失值，极大地减小了 SkinThickness 和 Insulin 的方差，但是 Insulin的方差仍很高。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA4gAAAKuCAYAAADjMjJRAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzs3XdUVNfax/EvZUAEUVGUEhuWFKMRNZYbu0YMllgSO1hji11RLBh7jxoxYkuiwZioiYkxNxo1zVRbriXFggVEQIoVReq8f+CdSHCUvDfMiPw+a7mW58xzhmfvdeaceWbv2WNjNBqNiIiIiIiISKFna+0ERERERERE5OGgAlFEREREREQAFYgiIiIiIiJyhwpEERERERERAVQgioiIiIiIyB0qEEVERERERARQgSgiIiIiIlLgHT16lICAgFz7v/rqK7p06UK3bt3YsmXLA5/HPj+SExEREREREctYu3Ytn376KU5OTjn2p6enM2/ePD788EOcnJzo0aMHzZs3x93d3exzaQRRRERERESkACtfvjyhoaG59p85c4by5ctTvHhxHBwcqFOnDocOHbrvc2kEUXJITzxr7RQKjHpP5x7Cl9wqOrhZO4UC4diti9ZOQR4xMTeTrJ1CgWCwtbN2CgXGofLVrJ1CgTDllqO1UygwtkZut3YKefIwvD82lPa57+N+fn5ER0fn2p+cnEyxYsVM287OziQnJ9/3uTSCKCIiIiIi8ghycXHh5s2bpu2bN2/mKBjvRQWiiIiIiIjII6hy5cpERkZy9epV0tLSOHToEL6+vvc9RlNMRUREREREHiE7duzg1q1bdOvWjeDgYAYMGIDRaKRLly6ULVv2vseqQBQRERERETEnK9PaGeTJY489ZvoZi/bt25v2t2jRghYtWuT5eTTFVERERERERACNIIqIiIiIiJhnzLJ2BhalEUQREREREREBVCCKiIiIiIjIHZpiKiIiIiIiYk6WppiKiIiIiIhIIaQRRBERERERETOMWqRGRERERERECiMViCIiIiIiIgJoiqmIiIiIiIh5WqRGRERERERECiONIIqIiIiIiJijRWpERERERESkMFKBKCIiIiIiIoCmmIqIiIiIiJiXlWntDCxKI4giIiIiIiICaARRRERERETEPC1SIyIiIiIiIoWRCkQREREREREB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EREREREBVCCKiIiIiIjIHZpiKiIiIiIiYo5WMRUREREREZHCSCOIIiIiIiIi5mRpBFFEREREREQKIRWIIiIiIiIiAmiKqYiIiIiIiHlapEZEREREREQKI40gioiIiIiImKNFakRERERERKQwUoEoIiIiIiIigKaYioiIiIiImKcppiIiIiIiIlIYaQRR5P/pwK/h1k6hwOhZZ4y1U3jo1XeuYO0UCowxGdbOoGBYqnMqT06lJVo7hQJjaYqrtVMoEMan6yL1qDEaM62dgkWpQJQc6j0dYO0UCgQVhyIiIiLyKNIUUxEREREREQE0gigiIiIiImKeFqkRERERERGRwkgjiCIiIiIiIuYYNYIoIiIiIiIihZAKRBEREREREQE0xVRERERERMQ8LVIjIiIiIiIihZEKRBEREREREQE0xVRERERERMQ8rWIqIiIiIiIihZFGEEVERERERMzRIjUiIiIiIiJSGKlAFBEREREREUBTTEVERERERMzTIjUiIiIiIiJSGGkEUURERERExBwtUiMiIiIiIiKFkQpEERERERERATTFVERERERExDxNMRUREREREZHCSCOIIiIiIiIi5uhnLkRERERERKQwUoEoIiIiIiIigKaYioiIiIiImKdFakRERERERKQw0giiiIiIiIiIOVqkRkRERERERAojFYgiIiIiIiICaIqpiIiIiIiIeYVskRoViGJVjVo1ZMTkITg4OHD6jwhmjJnHzeRb94yduXwqp/84Q3jY+wC4FHPmtaWTqFilAra2NuzYspP1K96zZPoPFaPRyJTZr1O1ckX69XzJ2ulYRe0Wdeg5IRCDg4HIE+cJmxBKSnJKjpjGnZrSYVAnMBpJvZ3G26+t5ezxCGxsbOgVHEjtFnUxZmURez6WNZNWcv3ydSu1Jn/ValGH7hN6Y+9g4MKJSNZMWJGrr57r1JR2g17EaIS026lseG0d546fyRETMK0/ZSt6srj/HEumbxXFW9bhseDe2DgaSPkjknPjVpD1lz4rN60vJdv9i8yryQDcPnORM0Nft0a6FqXzKe+ea9mQ4ZMH4+Bg4PQfZ5g1dr7Z+970NyYT8cdZNq76INdjC9+aTWJcIgunLMvvlK3i6ea+vDihJwYHA9EnItk4cRW3/3JO1evYmOcHt88+p1JS2TL9HaKOn6Xra/2oUv9JU1yJsm5ci7/CnBeC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IiIiUkAdPnyYxo0bA1CrVi1+/fVX02NOTk54eXmRkpJCSkoKNjY2D3w+jSCKiIiIiIiY85BPMU1OTsbFxcW0bWdnR0ZGBvb22aWep6cnbdu2JTMzk8GDBz/w+TSCKCIiIiIiUkC5uLhw8+ZN03ZWVpapONy3bx/x8fF8+eWXfPPNN+zdu5djx47d9/lUIIqIiIiIiJhjzLL+v/uoXbs2+/btA+DIkSNUq1bN9Fjx4sUpUqQIDg4OODo6UqxYMa5fv37f59MUUxERERERkQLq+eef54cffqB79+4YjUbmzp3LO++8Q/ny5WnZsiU//vgjXbt2xdbWltq1a/Pcc8/d9/lUIIqIiIiIiBRQtra2zJw5M8e+ypUrm/4/cuRIRo4cmefnU4EoIiIiIiJihjHLaO0ULErfQRQRERERERFABaKIiIiIiIjcoSmmIiIiIiIi5jzkv4P4T9MIooiIiIiIiAAaQRQRERERETHvAb9D+KjRCKKIiIiIiIgAKhBFRERERETkDk0xFRERERERMaeQ/Q6iCkTJoaKDm7VTkEfQpsNLrZ1CgdC59khrp1Ag9EqLs3YKBcILhirWTqFA2JJ01topFBjtPMtbO4UCYbLtVWunUGB8ae0E5J5UIIr8P/SsM8baKRQYKg5FRESkQNPPXIiIiIiIiEhhpAJRREREREREAE0xFRERERERMU9TTEVERERERKQw0giiiIiIiIiIOcbC9TMXGkEUERERERERQAWiiIiIiIiI3KEppiIiIiIiIuZokRoREREREREpjDSCKCIiIiIiYk6WFqkRERERERGRQkgFooiIiIiIiACaYioiIiIiImKeUYvUiIiIiIiISCGkAlFEREREREQATTEVERERERExT6uYioiIiIiISGGkEUQREREREREzjFlapEZEREREREQKIRWIIiIiIiIiAmiKqYiIiIiIiHlapEZEREREREQKI40gioiIiIiImGPUIjUiIiIiIiJSCKlAFBEREREREUBTTEVERERERMzTIjUiIiIiIiJSGGkEUURERERExJwsLVIjIiIiIiIihZAKRBEREREREQE0xVSsqE6LuvSeGIjBwUDkifOsCFpOSnJKjpimnZrx4uDOYDSSmpLKuulrOHMswvR4UVdn5mydx4qg5Tn2P2pqt6hDzwl/9lXYhNBcfdW4U1M6DOqU3Ve303j7tbWc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xMnpkm86lW9v7RQKBHubQj/4nmebDi+1dgoFRufaI62dQoFwMqXgTj+0pBecqzw4SHgz5jtrp1BgTPVsZu0UCoTvMhMeHCQAfBm9+8FBD4HkSV2snQIu8yw37VfvckVERERERAQopFNMRURERERE8kSL1IiIiIiIiEhhpAJRREREREREAE0xFRERERERMU9TTEVERERERKQw0giiiIiIiIiIOcbC9TuIGkEUERERERERQAWiiIiIiIiI3KEppiIiIiIiIuZokRoREREREREpjDSCKCIiIiIiYoZRI4giIiIiIiJSGKlAFBEREREREUBTTEVERERERMzTFFMREREREREpjDSCKCIiIiIiYk5WlrUzsCiNIIqIiIiIiAigAlFERERERETu0BRTERERERERc7RIjYiIiIiIiBRGGkEUERERERExRyOIIiIiIiIiUhipQBQRERERERFAU0xFRERERETMMho1xVREREREREQKIY0gioiIiIiImKNFakRERERERKQwUoEoIiIiIiIigKaYioiIiIiImKcppiIiIiIiIlIYaQRRcjh266K1UygQ6jtXsHYK8gja9stya6dQYHStPcraKTz0xpRIsnYKBcLOm57WTqHA+CwtytopFAjPO5azdgoi/xMViCKSrzrXHmntFAoEFYciIiIPJ6OmmIqIiIiIiEhhpBFEERERERERczSCKCIiIiIiIoWRCkQREREREREBNMVURERERETEvCxrJ2BZGkEUERERERERQCOIIiIiIiIiZulnLkRERERERKRQUoEoIiIiIiIigKaYioiIiIiImKcppiIiIiIiIlIYaQRRRERE/o+9Ow+P6ez/OP6eJJMgBFlIgqK2au3UUkVRYqnHvgtqKVVrLCGxxC5ELLHrpqW2NtVqy2NpVTeqWqWK1r5ESGKJNZHM/P6IZ0iTqfT3PJnJ8nldV66rZ+Z7ju99ep855zv3PeeIiIg1esyFiIiIiIiI5EYqEEVERERERATQFFMRERERERGr9BxEERERERERyZU0gigiIiIiImKNblIjIiIiIiIiuZEKRBEREREREQE0xVRERERERMQq3aRGREREREREciUViCIiIiIiIgJoiqmIiIiIiIh1uoupiIiIiIiI5EYaQRQREREREbHCrBFEERERERERyY1UIIqIiIiIiAigKaYiIiIiIiLWaYqpiIiI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BFFERERERMQac9Z+ZuTBgwdp0KABANWqVeO3336zvPfLL79Qvnx5QkNDuXDhAp07d8bd3d3apgAViCIiIiIiItnW7du3yZ8/v2XZ0dGRpKQknJycuH79Ovv372fLli3ky5ePnj17Uq1aNUqXLm11eyoQRURERERErMjqj7nInz8/d+7csSybTCbLM90LFSpE5cqV8fLyAqBWrVocO3bsbwtE/QZRREREREQkm6pRowZ79+4F4NChQ5QvX97yXqVKlfjjjz+4du0aSUlJ/Prrr5QtW/Zvt6cRRBERERERkWyqWbNmfPfdd3Tr1g2z2cysWbN45513eOqpp2jatCmjR49mwIABALRo0SJVAZkeFYgiIiIiIiJWmE1Z+yY1Dg4OTJs2LdVrZcqUsfx369atad26dca39z/LTERERERERLI1FYgiIiIiIiICaIqpiIiIiIiIVVn9Lqb/axpBFBEREREREUAjiCIiIiIiIlaZzVn7JjX/axpBFBEREREREUAFooiIiIiIiDykKaYiIiIiIiJW6CY1IiIiIiIikitpBFFERERERMQKs0k3qREREREREZFcSAWiiIiIiIiIAJpiKiIiIiIiYpXZbO8MbEsjiCIiIiIiIgJoBFFERERERMQq3aRGREREREREciUViCIiIiIiIgJoiqmIiIiIiIhVmmIqIiIiIiIiuZJGEEVERERERKzQYy5EREREREQkV1KBKCIiIiIiIoCmmIqIiIiIiFiV225SowJR5P9hVJK9M8g+eiZG2zsFyYE2/bzI3ilkC71rBtg7hSwvj+Nte6eQbeRzcLZ3CtlCpURN0JPsTQWiiEgW0KXGCHunkG2oOBQREVsym3PXCKK+4hARERERERFABaKIiIiIiIg8pCmmIiIiIiIiVphN9s7AtjSCKCIiIiIiIoAKRBEREREREXlIU0xFRERERESsMOkupiIiIiIiIpIbaQRRRERERETECj0HUURERERERHIlFYgiIiIiIiICaIqpiIiIiIiIVWaTppiKiIiIiIhILqQRRBERERERESvMZntnYFsaQRQRERERERFABaKIiIiIiIg8pCmmIiIiIiIiVugmNSIiIiIiIpIraQRRRERERETECpNZI4giIiIiIiKSC6lAFBEREREREUBTTEVERERERKwya4qpiIiIiIiI5EYaQRQREREREbHCbLZ3Bral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QFNMRURERERErMpt0y01gigiIiIiIiKACkQRERERERF5SFNMRURERERErDDZ+DmE9qYRRBEREREREQE0gigiIiIiImKVWSOIIiIiIiIikhupQBQRERERERFAU0xFRERERESsMtk7ARvTCKKIiIiIiIgAGkEUERERERGxyoxuUiMiIiIiIiK5kApEERERERERATTFVERERERExCqT2d4Z2JZGEEVERERERARQgSgiIiIiIiIPaYqpiIiIiIiIFSbdxVRERERERERyI40gioiIiIiIWKHnIIqIiIiIiEiupAJRREREREREAE0xFRERERERscpk7wRsTCOIIiIiIiIiAmgEUURERERExCrdpEZERERERERyJRWIIiIiIiIiAmiKqYiIiIiIiFW6SY2IiIiIiIjkShpBFBERERERsUIjiCIiIiIiIpIraQRRUom6E2fvFLKFBa4l7Z1CttHSWNbeKWQLowrp2JP/vfcOhts7hWyhYdX+9k4hWzh4/ZS9U8gWjhUpau8URP4rKhBFRCRb6V0zwN4pZAsqDkVE/jf0HEQRERERERHJlTSCKCIiIiIiYoUpdw0gagRRREREREREUqhAFBEREREREUBTTEVERERERKwy6SY1IiIiIiIikhtpBFFERERERMQKs70TsDGNIIqIiIiIiAigAlFEREREREQe0hRTERERERERK0z2TsDGNIIoIiIiIiIigApEEREREREReUhTTEVERERERKwwGfQcRBEREREREcmFNIIoIiIiIiJihZ6DKCIiIiIiIrmSCkQREREREREBNMVURERERETEKj0HUURERERERHIljSCKiIiIiIhYYcpdT7nQCKKIiIiIiIikUIEoIiIiIiIigKaYioiIiIiIWGUid80x1QiiiIiIiIiIABpBFBERERERscps7wRsTCOIIiIiIiIi2ZTJZGLy5Ml07doVf39/zp07l27MgAEDWL9+/RO3pwJRREREREQkm9q1axeJiYls3LiR0aNHM2fOnDQxCxcu5ObNmxnanqaYioiIiIiIWJHVn4N48OBBGjRoAEC1atX47bffUr2/fft2DAYDDRs2zND2NIIoIiIiIiKSTd2+fZv8+fNblh0dHUlKSgLgjz/+4LPPPmPEiBEZ3p5GEEVERERERKww2TuBJ8ifPz937tyxLJtMJpycUsq8LVu2cOXKFfr06cOl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RhBFRERERESsMhnsnYFtaQRRREREREREABWIIiIiIiIi8pCmmIqIiIiIiFih5yCKiIiIiIhIrqQRRBERERERESs0gigiIiIiIiK5kgpEERERERERATTFVERERERExCqzvROwMY0gioiIiIiICKACUURERERERB7SFFMRERERERErTAZ7Z2BbGkEUERERERERQCOIIiIiIiIiVuk5iCIiIiIiIpIrqUAUERERERERQFNMRURERERErNJzEEVERERERCRX0giiiIiIiIiIFaZcNoaoAlFSMTo42juFbOGPxFh7p5BtbIo7be8UsoVtd3zsnUK2kcfxtr1TkBxm769v2TuFbMOj5Mv2TiHL+yFJ1wiSvalAFBERyYEaVu1v7xSyBRWHIiKpqUAUERERERGxQs9BFBERERERkVxJI4giIiIiIiJW5K5b1GgEUURERERERB5SgSgiIiIiIiKAppiKiIiIiIhYpZvUiIiIiIiISK6kEUQRERERERErTAZ7Z2BbGkEUERERERERQAWiiIiIiIiIPKQppiIiIiIiIlaYctmTEDWCKCIiIiIiIoBGEEVERERERKzKXeOHGkEUERERERGRh1QgioiIiIiICKAppiIiIiIiIlaZ7J2AjWkEUURERERERAAViCIiIiIiIvKQppiKiIiIiIhYoecgioiIiIiISK6kEUQRERERERErctf4oUYQRURERERE5CEViCIiIiIiIgJoiqmIiIiIiIhVeg6iiIiIiIiI5EoaQRQREREREbFCj7kQERERERGRXEkFooiIiIiIiACaYioiIiIiImJV7ppgqhFEEREREREReUgFotiUn19jvt//BQd/2cWa95dQoED+DMe4uRXgvbVL2XdgGz/+9G9GBgxKs27JksU5d+FnqlevnOltsaX6Teuxfve7fPTNOuasmoZr/nxWY0MWBdFrcLd035v71gzGzRyZWWnaTKuWTfn54E6O/raXDetXptuPrMU4ODgwP2wqvx35muO/f8trA/0t69SqWZW9e7bw04Ed/PLzLnr06GB5b8jrffn10Jcc+mU3kR+9jZeXR+Y31EZealafT/esZ/sPH7HorTm45ne1Ghu6JIR+Q3rZMDv7avDyC3z45ft8+u0GwlbP/Ntjb8biSfR5vYdl2SWPC1MXBBO5Zy2RX69j6oJgXPK42CJtm3uhaV3e3/kmG/au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Q/Pnz+fNN9/E3t6eIUOGULNmTVq0aGHpsMwqT24fS4eQJZTMY5mFfrKiQzFnLR1CluDj7GnpELKMHDbP1jL1mSW3TQ5Lh5Al7D682NIhZCmuRbL3b1RmxIv5Slg6hCxjR0TWyK7oV7TtXxfKZHPOrzXb3/WPnkF8VuXOnZu2bduSI0cOvL2901wpVURERERE5FmlAeJjOnfuTOfOnS0dhoiIiIiIPCWyW7pl9v0lWhEREREREUlBA0QREREREREBlGIqIiIiIiKSLkM2SzLVDKKIiIiIiIgAGiCKiIiIiIjIQ0oxFRERERERSYfB0gGYmWYQRUREREREBNAMooiIiIiISLqMWqRGREREREREsiMNEEVERERERARQiqmIiIiIiEi6tEiNiIiIiIiIZEuaQRQREREREUmHFqkRERERERGRbEkDRBEREREREQGUYioiIiIiIpIuLVIjIiIiIiIi2ZJmEEVERERERNJhMGqRGhEREREREcmGNEAUERERERERQCmmIiIiIiIi6cpeCaaaQRQREREREZGHNIMoIiIiIiKSDkM2m0PUDKKIiIiIiIgAGiCKiIiIiIjIQ0oxFRERERERSYdRKaYiIiIiIiKSHWmAKCIiIiIiIoBSTEVERERERNJlsHQAZqYBoqRwoHBJS4eQJYTezWPpELKM1zwLWzqELGHT/QuWDiHLyGVtb+kQsoSDN85YOgR5BsWEb7d0CFnCm5WHWDoEkX9MA0QRERHJtlyL1Ld0CFmGBoeSXel3EEVERERERCRb0gBRREREREREAKWYioiIiIiIpEu/gygiIiIiIiLZkmYQRURERERE0pHdfuZCM4giIiIiIiICaIAoIiIiIiIiDynFVEREREREJB1GoxapERERERERkWxIM4giIiIiIiLpMOhnLkRERERERCQ70gyiiIiIiIhIFmUwGAgODubEiRPY29szbtw4ihQpYnp96dKlbN68GYA6derQv3//J55PM4giIiIiIiLpMDwFf55k+/bt3L9/nzVr1hAQEMDEiRNNr128eJENGzawevVq1qxZw/fff8/x48efeD7NIIqIiIiIiGRRBw8epFatWgBUqFCBX3/91fSah4cHixYtwsbGBoDExEQcHByeeD4NEEVERERERNJhfMoXqYmPj8fR0dG0bWNjQ2JiIra2ttjZ2eHi4oLRaGTy5Mk8//zz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JycnJk7MfumYIiIiIiL/peyWbqkB4jOkcePGNG6sFFEREREREflnNEAUERERERFJhyGbzSHqyWwREREREREBNEAUERERERGRh5RiKiIiIiIikg6lmIqIiIiIiEi2pBlEERERERGRdBiNmkEUERERERGRbEgDRBEREREREQGUYioiIiIiIpIuLVIjIiIiIiIi2ZIGiCIiIiIiIgIoxVRERERERCRdRqWYioiIiIiISHakGUQREREREZF06HcQRUREREREJFvSAFFEREREREQApZiKiIiIiIikS7+DKCIiIiIiItmSZhBFRERERETSoUVqREREREREJFvSAFFEREREREQApZiKiIiIiIikS4vUiIiIiIiISLakGUQREREREZF0GDWDKCIiIiIiItmRBogiIiIiIiICKMVUREREREQkXQb9DqKIiIiIiIhkR5pBFBERERERSUd2W6RGA0RJIeiOg6VDyBKGPEi0dAhZxkjrWEuHkCU0cChk6RCyjBfuK/klI44VcLd0CFnCT4nXLB2CPIM+OjjV0iGI/GMaIIqIiIjIX3qz8hBLh5AlaHAoWZ0GiCIiIiIiIunQIjUiIiIiIiKSLWkGUUREREREJB3ZbZEazSCKiIiIiIgIoAGiiIiIiIiIPKQUUxERERERkXRokRoRERERERHJljRAFBEREREREUAppiIiIiIiIunSKqYiIiIiIiKSLWkGUUREREREJB1apEZERERERESyJQ0QRUREREREBFCKqYiIiIiISLq0SI2IiIiIiIhkS5pBFBERERERSYfRaLB0CGalGUQREREREREBNEAUERERERGRh5RiKiIiIiIikg6DFqkRERERERGR7EgziCIiIiIiIukwGjWDKCIiIiIiItmQBogiIiIiIiICKMVUREREREQkXVqkRkRERERERLIlzSCKiIiIiIikQ4vUiIiIiIiISLakAaKIiIiIiIgASjEVERERERFJl0EppiIiIiIiIpIdaQZRLKZS3cp0HNoFO3s7wo+fZ+7QmdyNv5uiTK2WdXi9V0swGkm4d58lYxZy9uhprKys6DS8C5XqVsFoMBB1PooFI+YQdz3OQrUxn7z1KlNoRCesHOy483s45wJmk/Sndiv8rj8uzWqQGBsPwL0zkZzuM80S4ZpVtbpV6TGiG3b2dpw9do6pQ6ZzJ/5OmmWHhQZy9vg51s3/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mNSPIN8AGnT1Jb+3G1UaVaNKo2qmY9/vOIb4bPRFlkhmsDJmt6cu5YneKPJsLi3+XxvywMbSIWQZI631QZ0RVW2fzVUbM8ML95X8khHH7P/ec23Z1U+J1/66kADgaeNo6RCyhI8OTrV0CFmGXX4fS4eQIfnzWD4D71rcSbP9XfqUFREREREREUADRBEREREREXlIzyCKiIiIiIikw5DNnsjTDKKIiIiIiIgAmkEUERERERFJV3Zb01MziCIiIiIiIgJogCgiIiIiIiIPKcVUREREREQkHQaUYioiIiIiIiLZkGYQRURERERE0qFFakRERERERCRb0gBRREREREREAKWYioiIiIiIpMugFFMRERERERHJjjSDKCIiIiIikg6jfuZCREREREREsiMNEEVERERERARQiqmIiIiIiEi6tEiNiIiIiIiIZEsaIIqIiIiIiAigFFMREREREZF0GZViKiIiIiIiItmRZhBFRERERETSod9BFBERERERkWxJA0QREREREREBlGIqIiIiIiKSLi1SIyIiIiIiItmSZhBFRERERETSoRlEERERERERyZY0QBQRERERERFAKaYiIiIiIiLpyl4JpppBFBERERERkYesjNntqUsRERERERFJk2YQRUREREREBNAAUURERERERB7SAFFEREREREQADRBFRERERETkIQ0QRUREREREBNAAUURERERERB7SAFH+kb1791KjRg38/Pzw8/Ojbdu2hIWFWTqsVHbv3s2aNWssHUaGXLx4kbfffpu2bdvSpUsXevXqxalTpxg+fDi7d++2dHj/qcf7T+fOnWnfvj1nzpzBz8+PM2fO/Ktzv/zyywDMnDmTRo0amfpo+/bt2bt3738RvtktWLAAf39/unXrRvfu3fn111/TbKvx48cTGRmZ5jlOnDhhaouyZcvSqVMn/Pz8+Pbbb9M817Fjx5g1a1a6Mf3Rzs+iiIgI2rZt+6/Ps379eqZOnUp0dDTBwcH/PrAsIr339/Dhw6lSpQr37983lf3tt98oVaoUe/fuzXC7p3X+LVu2/GWf/ePfIyMSEhJYt25dhso+zs/PjzZt2pjea/7+/ly5ciVDx65atYqZM2dman8ZPnw4zZo1M8Xn5+eX7jXj74iNjWXjxo1A8vXqyJEj//qcaVmwYAE1a9YkISEhU87/NLp48SIDBgwwfY4FBwcT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\n",
      "text/plain": [
       "<Figure size 1080x864 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "'\\n热力图heatmap:相关系数矩阵\\n1.data:矩阵数据集，可以是numpy的数组（array），也可以是pandas的DataFrame。\\n如果是DataFrame，则df的index/column信息会分别对应到heatmap的columns和rows，即pt.index是热力图的行标，pt.columns是热力图的列标\\n2.annot(annotate的缩写):默认取值False；如果是True，在热力图每个方格写入数据；如果是矩阵，在热力图每个方格写入该矩阵对应位置数据 \\n3.mask:控制某个矩阵块是否显示出来。默认值是None。如果是布尔型的DataFrame，则将DataFrame里True的位置用白色覆盖掉 \\n4.cbar:是否在热力图侧边绘制颜色刻度条，默认值是True \\n'"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cols=trainFilled.columns\n",
    "data_corr=trainFilled.corr().abs()\n",
    "'''\n",
    "data.corr() #相关系数矩阵，即给出了任意两个变量之间的相关系数\n",
    "data.corr()[u'好'] #只显示“好”与其他感情色彩的相关系数\n",
    "data[u'好'].corr(data[u'哭']) #两个感情色彩的相关系数\n",
    "https://blog.csdn.net/c1z2w3456789/article/details/80929140\n",
    "'''\n",
    "plt.figure(figsize=(15,12))\n",
    "sns.heatmap(data_corr,annot=True)\n",
    "sns.heatmap(data_corr,mask=data_corr<1,cbar=False)\n",
    "plt.show()\n",
    "'''\n",
    "热力图heatmap:相关系数矩阵\n",
    "1.data:矩阵数据集，可以是numpy的数组（array），也可以是pandas的DataFrame。\n",
    "如果是DataFrame，则df的index/column信息会分别对应到heatmap的columns和rows，即pt.index是热力图的行标，pt.columns是热力图的列标\n",
    "2.annot(annotate的缩写):默认取值False；如果是True，在热力图每个方格写入数据；如果是矩阵，在热力图每个方格写入该矩阵对应位置数据 \n",
    "3.mask:控制某个矩阵块是否显示出来。默认值是None。如果是布尔型的DataFrame，则将DataFrame里True的位置用白色覆盖掉 \n",
    "4.cbar:是否在热力图侧边绘制颜色刻度条，默认值是True \n",
    "https://blog.csdn.net/cymy001/article/details/79576019\n",
    "'''"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Glucose与Insulin和是否是糖药病相关性高一些。年龄与怀孕次数相关性较高，BMI 与SkinThickness 相关性较高。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "5. 数据预处理"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "5.1 分离特征值和预测值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "Y_train = trainFilled['Outcome']\n",
    "X_train = trainFilled.drop([\"Outcome\"], axis=1)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "5.2 标准化数值并且分离测试样本和训练样本"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\Anaconda3\\lib\\site-packages\\sklearn\\cross_validation.py:41: DeprecationWarning: This module was deprecated in version 0.18 in favor of the model_selection module into which all the refactored classes and functions are moved. Also note that the interface of the new CV iterators are different from that of this module. This module will be removed in 0.20.\n",
      "  \"This module will be removed in 0.20.\", DeprecationWarning)\n"
     ]
    }
   ],
   "source": [
    "# 数据标准化\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "# 采用sklearn的分割函数\n",
    "from sklearn.cross_validation import train_test_split\n",
    "\n",
    "# 初始化特征的标准化器\n",
    "ss_X = StandardScaler()\n",
    "\n",
    "# 分别对训练和测试数据的特征进行标准化处理\n",
    "X_train = ss_X.fit_transform(X_train)\n",
    "\n",
    "# 分割比率20%\n",
    "x_train, x_test, y_train, y_test = train_test_split(X_train, Y_train, test_size=0.20, random_state=20) \n",
    "#random_state就是为了保证程序每次运行都分割一样的训练集合测试集。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "6. Logistic 模型训练及评估"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "6.1 通过gridSearchCV 寻找最佳参数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv=5, error_score='raise',\n",
       "       estimator=LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n",
       "          intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,\n",
       "          penalty='l2', random_state=None, solver='liblinear', tol=0.0001,\n",
       "          verbose=0, warm_start=False),\n",
       "       fit_params=None, iid=True, n_jobs=1,\n",
       "       param_grid={'penalty': ['l1', 'l2'], 'C': [0.001, 0.01, 0.1, 1, 10, 100, 1000]},\n",
       "       pre_dispatch='2*n_jobs', refit=True, return_train_score='warn',\n",
       "       scoring='neg_log_loss', verbose=0)"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "\n",
    "#需要调优的参数\n",
    "# 请尝试将L1正则和L2正则分开，并配合合适的优化求解算法（slover）\n",
    "#方法1：tuned_parameters={'penalty':['l1','l2'],'C':[0.01,0.03,0.05,0.07,0.1,0.3,0.5,0.7,1,3,5,7,10,20,50,70,100], 'solver':['liblinear'],'multi_class':['ovr']} \n",
    "#方法2：\n",
    "penaltys=['l1','l2']\n",
    "Cs=[0.001,0.01,0.1,1,10,100,1000]\n",
    "tuned_parameters=dict(penalty=penaltys,C=Cs)\n",
    "\n",
    "lr_penalty= LogisticRegression()\n",
    "grid= GridSearchCV(lr_penalty, tuned_parameters,cv=5, scoring='neg_log_loss')\n",
    "grid.fit(x_train,y_train.ravel())\n",
    "'''\n",
    "lr_penalty:判断器\n",
    "tuned_parameters：要调整的参数\n",
    "scoring='neg_log_loss'：评价指标\n",
    "'''\n",
    "\n",
    "# 训练\n",
    "grid.fit(x_train,y_train)\n",
    "'''\n",
    "fit()可以说是调用的通用方法。fit(X)，表示用数据X来训练某种模型。 函数返回值一般为调用fit方法的对象本身。\n",
    "fit(X,y=None)为无监督学习算法，fit(X,Y)为监督学习算法\n",
    "'''\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split0_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "D:\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split1_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "D:\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split2_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "D:\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split3_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "D:\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split4_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "D:\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('mean_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "D:\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "{'mean_fit_time': array([0.0006    , 0.00080009, 0.00059996, 0.00060005, 0.00079999,\n",
       "        0.00080009, 0.00079999, 0.00080004, 0.00100012, 0.00099993,\n",
       "        0.00099998, 0.00099993, 0.00099993, 0.00100002]),\n",
       " 'std_fit_time': array([4.89901382e-04, 4.00042545e-04, 4.89862441e-04, 4.89940316e-04,\n",
       "        3.99994861e-04, 4.00042573e-04, 3.99994861e-04, 4.00018706e-04,\n",
       "        9.53674316e-08, 0.00000000e+00, 9.53674316e-08, 0.00000000e+00,\n",
       "        0.00000000e+00, 1.90734863e-07]),\n",
       " 'mean_score_time': array([0.0006    , 0.00059996, 0.00079999, 0.00079994, 0.00079999,\n",
       "        0.00059996, 0.00039997, 0.00059996, 0.00079999, 0.00079994,\n",
       "        0.00059996, 0.00059996, 0.00079994, 0.00039997]),\n",
       " 'std_score_time': array([0.0004899 , 0.00048986, 0.00039999, 0.00039997, 0.00039999,\n",
       "        0.00048986, 0.00048986, 0.00048986, 0.00039999, 0.00039997,\n",
       "        0.00048986, 0.00048986, 0.00039997, 0.00048986]),\n",
       " 'param_C': masked_array(data=[0.001, 0.001, 0.01, 0.01, 0.1, 0.1, 1, 1, 10, 10, 100,\n",
       "                    100, 1000, 1000],\n",
       "              mask=[False, False, False, False, False, False, False, False,\n",
       "                    False, False, False, False, False, False],\n",
       "        fill_value='?',\n",
       "             dtype=object),\n",
       " 'param_penalty': masked_array(data=['l1', 'l2', 'l1', 'l2', 'l1', 'l2', 'l1', 'l2', 'l1',\n",
       "                    'l2', 'l1', 'l2', 'l1', 'l2'],\n",
       "              mask=[False, False, False, False, False, False, False, False,\n",
       "                    False, False, False, False, False, False],\n",
       "        fill_value='?',\n",
       "             dtype=object),\n",
       " 'params': [{'C': 0.001, 'penalty': 'l1'},\n",
       "  {'C': 0.001, 'penalty': 'l2'},\n",
       "  {'C': 0.01, 'penalty': 'l1'},\n",
       "  {'C': 0.01, 'penalty': 'l2'},\n",
       "  {'C': 0.1, 'penalty': 'l1'},\n",
       "  {'C': 0.1, 'penalty': 'l2'},\n",
       "  {'C': 1, 'penalty': 'l1'},\n",
       "  {'C': 1, 'penalty': 'l2'},\n",
       "  {'C': 10, 'penalty': 'l1'},\n",
       "  {'C': 10, 'penalty': 'l2'},\n",
       "  {'C': 100, 'penalty': 'l1'},\n",
       "  {'C': 100, 'penalty': 'l2'},\n",
       "  {'C': 1000, 'penalty': 'l1'},\n",
       "  {'C': 1000, 'penalty': 'l2'}],\n",
       " 'split0_test_score': array([-0.69314718, -0.61369565, -0.65599061, -0.4748984 , -0.4447602 ,\n",
       "        -0.43975123, -0.444419  , -0.44472132, -0.4458879 , -0.44592378,\n",
       "        -0.44605027, -0.44605593, -0.44606578, -0.44606928]),\n",
       " 'split1_test_score': array([-0.69314718, -0.62102017, -0.65651854, -0.48417876, -0.43457105,\n",
       "        -0.42888459, -0.42668792, -0.42667002, -0.42693436, -0.42693027,\n",
       "        -0.42696996, -0.42696494, -0.42697167, -0.4269685 ]),\n",
       " 'split2_test_score': array([-0.69314718, -0.61599034, -0.66041642, -0.46239007, -0.39549768,\n",
       "        -0.38761344, -0.37652546, -0.3768737 , -0.37578763, -0.37584247,\n",
       "        -0.37574545, -0.37574067, -0.37573415, -0.37573051]),\n",
       " 'split3_test_score': array([-0.69314718, -0.61760717, -0.65668376, -0.48311187, -0.44953176,\n",
       "        -0.44459713, -0.44876524, -0.44946136, -0.45067657, -0.45075097,\n",
       "        -0.4508924 , -0.4508938 , -0.45091112, -0.45090823]),\n",
       " 'split4_test_score': array([-0.69314718, -0.63147594, -0.66076195, -0.52743539, -0.51297856,\n",
       "        -0.5055691 , -0.51436624, -0.51372326, -0.51546559, -0.51540728,\n",
       "        -0.51559896, -0.51559055, -0.51562207, -0.51560903]),\n",
       " 'mean_test_score': array([-0.69314718, -0.6199391 , -0.65806988, -0.48633607, -0.44736115,\n",
       "        -0.4411784 , -0.44203516, -0.44217359, -0.44283231, -0.44285298,\n",
       "        -0.44293325, -0.44293103, -0.44294278, -0.44293895]),\n",
       " 'std_test_score': array([0.        , 0.00622111, 0.00206788, 0.02190252, 0.03780778,\n",
       "        0.03783692, 0.04423391, 0.04394878, 0.04487243, 0.04484066,\n",
       "        0.04493525, 0.04493446, 0.04494682, 0.04494389]),\n",
       " 'rank_test_score': array([14, 12, 13, 11, 10,  1,  2,  3,  4,  5,  7,  6,  9,  8]),\n",
       " 'split0_train_score': array([-0.69314718, -0.62137812, -0.65734443, -0.48210283, -0.43296882,\n",
       "        -0.42589815, -0.42208099, -0.42199822, -0.42193346, -0.42193265,\n",
       "        -0.42193194, -0.42193194, -0.42193193, -0.42193193]),\n",
       " 'split1_train_score': array([-0.69314718, -0.61807276, -0.65814704, -0.48210477, -0.43667681,\n",
       "        -0.42980497, -0.42627486, -0.42619554, -0.42613548, -0.42613472,\n",
       "        -0.42613406, -0.42613406, -0.42613405, -0.42613405]),\n",
       " 'split2_train_score': array([-0.69314718, -0.62080801, -0.66771602, -0.48990563, -0.44838284,\n",
       "        -0.44135187, -0.43844811, -0.43830925, -0.43826236, -0.43826091,\n",
       "        -0.4382604 , -0.43826039, -0.43826038, -0.43826038]),\n",
       " 'split3_train_score': array([-0.69314718, -0.61937516, -0.66043354, -0.48004501, -0.43091888,\n",
       "        -0.42390682, -0.41997382, -0.41983689, -0.41976794, -0.4197665 ,\n",
       "        -0.41976573, -0.41976572, -0.41976571, -0.41976571]),\n",
       " 'split4_train_score': array([-0.69314718, -0.61278934, -0.63496342, -0.46678035, -0.41656584,\n",
       "        -0.40995263, -0.40607976, -0.40597292, -0.40590674, -0.40590543,\n",
       "        -0.40590472, -0.40590471, -0.4059047 , -0.4059047 ]),\n",
       " 'mean_train_score': array([-0.69314718, -0.61848468, -0.65572089, -0.48018772, -0.43310264,\n",
       "        -0.42618289, -0.42257151, -0.42246256, -0.4224012 , -0.42240004,\n",
       "        -0.42239937, -0.42239936, -0.42239935, -0.42239935]),\n",
       " 'std_train_score': array([0.        , 0.00307146, 0.01100443, 0.00750411, 0.01024218,\n",
       "        0.0101183 , 0.01043789, 0.0104314 , 0.01043783, 0.01043783,\n",
       "        0.0104379 , 0.01043789, 0.01043789, 0.0104379 ])}"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#查看训练结果\n",
    "grid.cv_results_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.4411783966036019\n",
      "{'C': 0.1, 'penalty': 'l2'}\n"
     ]
    }
   ],
   "source": [
    "#查看最佳得分及\n",
    "print(-grid.best_score_)\n",
    "print(grid.best_params_)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "找到最优解C值为0.1，正则项为 L2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "confusion matrix:\n",
      "[[87 14]\n",
      " [22 31]]\n",
      "regression report:\n",
      "             precision    recall  f1-score   support\n",
      "\n",
      "          1    0.68889   0.58491   0.63265        53\n",
      "          0    0.79817   0.86139   0.82857       101\n",
      "\n",
      "avg / total    0.76056   0.76623   0.76114       154\n",
      "\n",
      "accuracy score for train data: 0.80782\n",
      "accuracy score for test data: 0.76623\n"
     ]
    }
   ],
   "source": [
    "# 获得预测值\n",
    "lr_predict_test =grid.predict(x_test)\n",
    "lr_predict_train = grid.predict(x_train)\n",
    "#查看各种评价指标\n",
    "print(\"confusion matrix:\")\n",
    "print(metrics.confusion_matrix(y_test, lr_predict_test, labels=None) )\n",
    "'''\n",
    "sklearn.metrics.confusion_matrix:\n",
    "①混淆矩阵：sklearn.metrics.confusion_matrix(y_true, y_pred, labels=None, sample_weight=None)\n",
    "参数说明：\n",
    "y_true：真实因变量值\n",
    "y_pred：预测因变量值\n",
    "labels：矩阵的标签列表索引顺序\n",
    "sample_weight：样本权重\n",
    "'''\n",
    "print(\"regression report:\")\n",
    "print(metrics.classification_report(y_test, lr_predict_test, labels=[1,0], digits=5))\n",
    "'''\n",
    "sklearn中的classification_report函数用于显示主要分类指标的文本报告．在报告中显示每个类的精确度，召回率，F1值等信息。 \n",
    "主要参数: \n",
    "y_true：1维数组，或标签指示器数组/稀疏矩阵，目标值。 \n",
    "y_pred：1维数组，或标签指示器数组/稀疏矩阵，分类器返回的估计值。 \n",
    "labels：array，shape = [n_labels]，报表中包含的标签索引的可选列表。 \n",
    "target_names：字符串列表，与标签匹配的可选显示名称（相同顺序）。 \n",
    "sample_weight：类似于shape = [n_samples]的数组，可选项，样本权重。 \n",
    "digits：int，输出浮点值的位数．\n",
    "https://blog.csdn.net/akadiao/article/details/78788864\n",
    "'''\n",
    "print(\"accuracy score for train data: {0:.5f}\".format(metrics.accuracy_score(y_train, lr_predict_train)))\n",
    "print(\"accuracy score for test data: {0:.5f}\".format(metrics.accuracy_score(y_test, lr_predict_test)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "准确率在训练集上面约为0.81 在测试集上面的准确率约为 0.77"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('mean_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "D:\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "Text(0,0.5,'neg-logloss')"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# plot CV误差曲线\n",
    "test_means = grid.cv_results_[ 'mean_test_score' ]\n",
    "test_stds = grid.cv_results_[ 'std_test_score' ]\n",
    "train_means = grid.cv_results_[ 'mean_train_score' ]\n",
    "train_stds = grid.cv_results_[ 'std_train_score' ]\n",
    "\n",
    "\n",
    "# plot results\n",
    "n_Cs = len(tuned_parameters['C'])\n",
    "number_penaltys = len(tuned_parameters['penalty'])\n",
    "test_scores = np.array(test_means).reshape(n_Cs,number_penaltys)\n",
    "train_scores = np.array(train_means).reshape(n_Cs,number_penaltys)\n",
    "test_stds = np.array(test_stds).reshape(n_Cs,number_penaltys)\n",
    "train_stds = np.array(train_stds).reshape(n_Cs,number_penaltys)\n",
    "x_axis = np.log10(tuned_parameters['C'])\n",
    "\n",
    "for i, value in enumerate(tuned_parameters['penalty']):\n",
    "    plt.errorbar(x_axis, -test_scores[:,i] ,label = tuned_parameters['penalty'][i] +' Test')\n",
    "    plt.errorbar(x_axis, -train_scores[:,i],label = tuned_parameters['penalty'][i] +' Train')\n",
    "\n",
    "plt.legend()\n",
    "plt.xlabel( 'log(C)' )                                                                                                      \n",
    "plt.ylabel( 'neg-logloss' )\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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6667OHToUIvrFWkphYXIaZadnc2NN94IQG5uLk8//TSrV69m8+bNPPfcc2zZsoUXXngBgOnTp+uaDPEJuihPpAW+/PJLMjMz+f777wkLC2P+/PlccsklfPPNN8yaNYsffviBmJgY3n//fQoLC9m/fz+HDx+mZ8+eAKxevZrs7GzOPPNMADp06MCyZcuwWq0AnHfeeRw8eJD9+/cTHR3ttT5FdGQh0gKzZ88mPT2dl156iYyMDG6//Xb3VfPDhw/npZdeYtiwYe6hpLfeeou4uDgAvvvuO/79739z0UUX1XnPnj178vvf/9493bdvX/ctqEW8RWEh0kxVVVXs37+fa665BnDderxjx4588cUXFBUVkZiYCLhu9dGhQwcAysvL+fWvfw1AQIDrn19jt2U466yz/OJhSdK2KSxEmulkd8oxDAOHw4HZbD7pfJPJ5L4teadOnejevfsvnm3xz3/+kwceeMA9bbFY3MEi4i36GyjSTBEREZx99tm8/vrrgOtust9++y3nn38+V155JS+99BIA27dv58cffwRcDw06ePCg+z2mTZvG0qVLqaioAFxDU0uXLqVHjx7uZb766it9XiFepw+4RVrg/vvvZ8GCBTz88MMEBgby8MMPExQUxPz585kzZw4bNmzgwgsvdA9DDRo0iFmzZrnXnzhxIna7nT/+8Y+YTCYMw2DChAlcd9117mXef/99HnroodPem8jxFBYizXDFFVdwxRVXALB27dpfzH/ttde4++67Oe+88ygrK2PPnj0A9OjRg65du7Jnzx73My3S09PrvWZj165dnHXWWXTv3t1DnYg0jcJCxAN69OjBnXfeSUBAAMHBwSxatMg9LyMjg5UrV7Js2bJG32fNmjXMnTvXk6WKNImeZyEiIo3SB9wiItIohYWIiDRKYSEiIo1SWIiISKMUFiIi0qj/D3IGPWnc5xJQAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(x_axis, -test_scores[:,1], 'b-')\n",
    "plt.xlabel( 'log(C)' )                                                                                                      \n",
    "plt.ylabel( 'neg-logloss' )\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "根据C的取值 测试集的变化可以看出在 log(c) = -1 左右取值最小"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "7. 线性SVM"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "7.1 导入包"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 首先 import 必要的模块\n",
    "import pandas as pd \n",
    "import numpy as np\n",
    "\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.svm import LinearSVC\n",
    "\n",
    "#竞赛的评价指标为logloss\n",
    "#from sklearn.metrics import log_loss  \n",
    "#SVM并不能直接输出各类的概率，所以在这个例子中我们用正确率作为模型预测性能的度量\n",
    "from sklearn.metrics import accuracy_score\n",
    "\n",
    "from matplotlib import pyplot\n",
    "import seaborn as sns\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "7.2模型训练及最优值寻找"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [],
   "source": [
    "tuned_parameters_svc= {'penalty':['l2'],'C':[0.001,0.01,0.1,1,10,100,1000],'loss':['hinge']}\n",
    "grid_svc=GridSearchCV(LinearSVC(tol=1e-7,class_weight=\"balanced\", random_state=42),tuned_parameters_svc) \n",
    "grid_svc.fit(x_train,y_train)\n",
    "svc_predict_test =grid_svc.predict(x_test)\n",
    "svc_predict_train =grid_svc.predict(x_train)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "7.3 结果评分及曲线图绘制"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "best params for Linear SVC:  {'C': 1, 'loss': 'hinge', 'penalty': 'l2'}\n",
      "best score for Linear SVC:  0.8452768729641694\n",
      "confusion matrix:\n",
      "[[44  9]\n",
      " [19 82]]\n",
      "regression report:\n",
      "             precision    recall  f1-score   support\n",
      "\n",
      "          1    0.69841   0.83019   0.75862        53\n",
      "          0    0.90110   0.81188   0.85417       101\n",
      "\n",
      "avg / total    0.83134   0.81818   0.82128       154\n",
      "\n",
      "accuracy score for train data: 0.84853\n",
      "accuracy score for test data: 0.81818\n"
     ]
    }
   ],
   "source": [
    "print(\"best params for Linear SVC: \",grid_svc.best_params_)\n",
    "print(\"best score for Linear SVC: \",grid_svc.best_score_)\n",
    "print(\"confusion matrix:\")\n",
    "print(metrics.confusion_matrix(y_test, svc_predict_test, labels=[1, 0]) )\n",
    "print(\"regression report:\")\n",
    "print(metrics.classification_report(y_test, svc_predict_test, labels=[1,0], digits=5))\n",
    "print(\"accuracy score for train data: {0:.5f}\".format(metrics.accuracy_score(y_train, svc_predict_train)))\n",
    "print(\"accuracy score for test data: {0:.5f}\".format(metrics.accuracy_score(y_test, svc_predict_test)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "通过 GridSearchCV进行网格寻找，损失函数采用hinge-loss,采用不同的C值，最后发现 C=1时 为最优解。最好评分 0.85,在测试上的准确率为0.85。在训练集上的准确率为 0.81"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('mean_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "D:\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "Text(0,0.5,'accuracy')"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# plot CV误差曲线\n",
    "test_means = grid_svc.cv_results_[ 'mean_test_score' ]\n",
    "test_stds = grid_svc.cv_results_[ 'std_test_score' ]\n",
    "train_means = grid_svc.cv_results_[ 'mean_train_score' ]\n",
    "train_stds = grid_svc.cv_results_[ 'std_train_score' ]\n",
    "\n",
    "\n",
    "# plot results\n",
    "n_Cs = len(tuned_parameters_svc['C'])\n",
    "number_penaltys = len(tuned_parameters_svc['penalty'])\n",
    "test_scores = np.array(test_means).reshape(n_Cs,number_penaltys)\n",
    "train_scores = np.array(train_means).reshape(n_Cs,number_penaltys)\n",
    "test_stds = np.array(test_stds).reshape(n_Cs,number_penaltys)\n",
    "train_stds = np.array(train_stds).reshape(n_Cs,number_penaltys)\n",
    "x_axis = np.log10(tuned_parameters_svc['C'])\n",
    "\n",
    "for i, value in enumerate(tuned_parameters_svc['penalty']):\n",
    "    #pyplot.plot(log(Cs), test_scores[i], label= 'penalty:'   + str(value))\n",
    "    plt.errorbar(x_axis, test_scores[:,i] ,label = tuned_parameters_svc['penalty'][i] +' Test')\n",
    "    plt.errorbar(x_axis, train_scores[:,i] ,label = tuned_parameters_svc['penalty'][i] +' Train')\n",
    "\n",
    "\n",
    "plt.legend()\n",
    "plt.xlabel( 'log(C)' )                                                                                                      \n",
    "plt.ylabel( 'accuracy' )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(x_axis, test_scores[:,:], 'b-')\n",
    "plt.xlabel( 'log(C)' )                                                                                                      \n",
    "plt.ylabel( 'accuracy' )\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "可以看出线性SVM 的训练结果的准确率是要优于 logistic 回归的。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "8 RBF核SVM正则参数调优\n",
    "RBF核是SVM最常用的核函数。 RBF核SVM 的需要调整正则超参数包括C（正则系数，一般在log域（取log后的值）均匀设置候选参数）和核函数的宽度gamma C越小，决策边界越平滑； gamma越小，决策边界越平滑。\n",
    "\n",
    "采用交叉验证，网格搜索步骤与Logistic回归正则参数处理类似，在此略。\n",
    "\n",
    "这里我们用校验集（X_val、y_val）来估计模型性能"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "8.1 导入包及模型训练及最优值寻找"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.svm import SVC\n",
    "# 定义优化参数字典\n",
    "tuned_parameters_ksvc ={'C':[0.001,0.01,0.1,1,10,100,1000], 'gamma': [100,50,10,5,1,0.5,0.3,0.1,0.05,0.03,0.01,0.001,0.0001]}\n",
    "ksvc =SVC(tol=1e-6,kernel='rbf',class_weight=\"balanced\", random_state=20)\n",
    "grid_ksvc=GridSearchCV(ksvc,tuned_parameters_ksvc)\n",
    "# 训练数据\n",
    "grid_ksvc.fit(x_train,y_train)\n",
    "ksvc_predict_test =grid_ksvc.predict(x_test)\n",
    "ksvc_predict_train =grid_ksvc.predict(x_train)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "8.2 结果评分及图像绘制"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "best params for kernal svm:  {'C': 10, 'gamma': 0.03}\n",
      "best score for kernal svm:  0.8517915309446255\n",
      "confusion matrix:\n",
      "[[44  9]\n",
      " [23 78]]\n",
      "regression report:\n",
      "             precision    recall  f1-score   support\n",
      "\n",
      "          1    0.65672   0.83019   0.73333        53\n",
      "          0    0.89655   0.77228   0.82979       101\n",
      "\n",
      "avg / total    0.81401   0.79221   0.79659       154\n",
      "\n",
      "accuracy score for train data: 0.88925\n",
      "accuracy score for test data: 0.79221\n"
     ]
    }
   ],
   "source": [
    "print(\"best params for kernal svm: \",grid_ksvc.best_params_)\n",
    "print(\"best score for kernal svm: \",grid_ksvc.best_score_)\n",
    "print(\"confusion matrix:\")\n",
    "print(metrics.confusion_matrix(y_test, ksvc_predict_test, labels=[1, 0]) )\n",
    "print(\"regression report:\")\n",
    "print(metrics.classification_report(y_test, ksvc_predict_test, labels=[1,0], digits=5))\n",
    "print(\"accuracy score for train data: {0:.5f}\".format(metrics.accuracy_score(y_train, ksvc_predict_train)))\n",
    "print(\"accuracy score for test data: {0:.5f}\".format(metrics.accuracy_score(y_test, ksvc_predict_test)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    " C =1 gamma =0.03 的时候得到最优解，在训练集上准确率达到0.85 ,在测试集上面准确率达到0.81"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [],
   "source": [
    "def fit_grid_point_RBF(C, gamma, x_train, y_train, x_val, y_val):\n",
    "    \n",
    "    # 在训练集是那个利用SVC训练\n",
    "    SVC3 =  SVC( C = C, kernel='rbf', class_weight=\"balanced\",gamma = gamma)\n",
    "    SVC3 = SVC3.fit(x_train, y_train)\n",
    "    \n",
    "    # 在校验集上返回accuracy\n",
    "    accuracy = SVC3.score(x_val, y_val)\n",
    "    \n",
    "    print(\"accuracy: {}\".format(accuracy))\n",
    "    return accuracy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "accuracy: 0.34415584415584416\n",
      "accuracy: 0.5909090909090909\n",
      "accuracy: 0.34415584415584416\n",
      "accuracy: 0.34415584415584416\n",
      "accuracy: 0.34415584415584416\n",
      "accuracy: 0.7467532467532467\n",
      "accuracy: 0.7727272727272727\n",
      "accuracy: 0.5584415584415584\n",
      "accuracy: 0.34415584415584416\n",
      "accuracy: 0.34415584415584416\n",
      "accuracy: 0.8116883116883117\n",
      "accuracy: 0.7987012987012987\n",
      "accuracy: 0.8246753246753247\n",
      "accuracy: 0.6558441558441559\n",
      "accuracy: 0.6558441558441559\n",
      "accuracy: 0.8246753246753247\n",
      "accuracy: 0.7987012987012987\n",
      "accuracy: 0.8116883116883117\n",
      "accuracy: 0.6558441558441559\n",
      "accuracy: 0.6558441558441559\n",
      "accuracy: 0.7987012987012987\n",
      "accuracy: 0.7792207792207793\n",
      "accuracy: 0.8116883116883117\n",
      "accuracy: 0.6558441558441559\n",
      "accuracy: 0.6558441558441559\n"
     ]
    }
   ],
   "source": [
    "#需要调优的参数\n",
    "C_s = np.logspace(-2, 2, 5)# logspace(a,b,N)把10的a次方到10的b次方区间分成N份 \n",
    "gamma_s = np.logspace(-2, 2, 5)  \n",
    "\n",
    "accuracy_s = []\n",
    "for i, oneC in enumerate(C_s):\n",
    "    for j, gamma in enumerate(gamma_s):\n",
    "        tmp = fit_grid_point_RBF(oneC, gamma, x_train, y_train, x_test, y_test)\n",
    "        accuracy_s.append(tmp)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "accuracy_s1 =np.array(accuracy_s).reshape(len(C_s),len(gamma_s))\n",
    "x_axis = np.log10(C_s)\n",
    "for j, gamma in enumerate(gamma_s):\n",
    "    pyplot.plot(x_axis, np.array(accuracy_s1[:,j]), label = ' Test - log(gamma)' + str(np.log10(gamma)))\n",
    "\n",
    "pyplot.legend()\n",
    "pyplot.xlabel( 'log(C)' )                                                                                                      \n",
    "pyplot.ylabel( 'accuracy' )\n",
    "pyplot.savefig('RBF_SVM_Otto.png' )\n",
    "\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
